package com.cndw.kungfu.model.queue;

import java.util.concurrent.ScheduledFuture;

import com.cndw.kungfu.config.ConstantsQueue;
import com.cndw.kungfu.domain.Queue;
import com.cndw.kungfu.ext.TimeProcesser;
import com.cndw.kungfu.model.Context;

/**
 * 单个执行的队列
 * 
 * @author fantadust [9677889@qq.com]
 * @date 2011-8-25 下午3:09:18
 */
public class QueueHandler implements Runnable {

	private Queue queue;

	private ScheduledFuture<?> task;

	public QueueHandler(Queue queue) {
		this.queue = queue;
		queue.setStatus(Queue.statusOnStart);
		queue.setQueueHandler(this);
		start();
	}

	private void start() {
		if (queue.getStatus() == Queue.statusOnEnd) {
			return;
		}
		if (queue.getNextExecTime() == 0) {
			//周期运行队列自动加入下次执行时间
			if (queue.getIntervalTime() > 0) {
				queue.setNextExecTime(queue.getBeginTime() + queue.getIntervalTime() );
			}else {
				queue.setNextExecTime(queue.getEndTime());
			}			
		}
		//过时的队列 立即执行
		int delay = queue.getNextExecTime() - TimeProcesser.getUnixTime();
		if (delay <= 0) {
			run();
		} else {
			task = Context.getTimerServer().scheduleSeconds(this, delay);
		}

	}

	public void stop() {
		if (task != null) {
			task.cancel(false);
		}
	}

	@Override
	public void run() {
		if (queue.getStatus() == Queue.statusOnEnd) {
			return;
		}

		queue.setStatus(Queue.statusOnRun);
		int currentExecTime = queue.getNextExecTime();
		//本次执行时间
		queue.setLastExecTime(currentExecTime);
		queue.setNextExecTime(0);//先把下次执行时间清理

		boolean execSuc = false;
		// 执行函数过程
		switch (queue.getFuncType()) {
		case ConstantsQueue.funcTypeStudySkill:
			execSuc = QueueFunc.studySkill(queue);
			break;
		case ConstantsQueue.funcTypeGestStudy:
			execSuc = QueueFunc.studyGest(queue);
			break;
		case ConstantsQueue.funcTypeMarryTreeStudy:
			execSuc = QueueFunc.studyMarryTree(queue);
			break;			
		default:
			break;
		}

		if (queue.getNextExecTime() == 0 && queue.getIntervalTime() >0) {
			queue.setNextExecTime(currentExecTime + queue.getIntervalTime());			
		}
		//本次执行时间已是最后时间,则表示完成
		if (currentExecTime >= queue.getEndTime()) {
			queue.setStatus(Queue.statusOnEnd);
		}
		
		if (queue.getStatus() == Queue.statusOnEnd) {
			Context.getQueueServer().deleteQueue(queue);
		} else if (execSuc) {
			Context.getQueueServer().updateQueue(queue);
			start();
		}

	}

}
